// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved

#include "Private.h"
#include "FileMapping.h"
#include "Globals.h"

//---------------------------------------------------------------------
//
// ctor
//
//---------------------------------------------------------------------

CFileMapping::CFileMapping() : CFile() {
	_fileMappingHandle = nullptr;
	_pMapBuffer = nullptr;
}

//---------------------------------------------------------------------
//
// dtor
//
//---------------------------------------------------------------------

CFileMapping::~CFileMapping() {
	if (_pMapBuffer) {
		UnmapViewOfFile(_pMapBuffer);
		_pMapBuffer = nullptr;
		_pReadBuffer = nullptr;
	}
	if (_fileMappingHandle) {
		CloseHandle(_fileMappingHandle);
		_fileMappingHandle = nullptr;
	}
}

//---------------------------------------------------------------------
//
// SetupReadBuffer
//
//---------------------------------------------------------------------

BOOL CFileMapping::SetupReadBuffer() {
	if (_fileSize > sizeof(WCHAR)) {
		//
		// Read file in file mapping
		//
		_fileMappingHandle = CreateFileMapping(_fileHandle, NULL, PAGE_READONLY, 0, 0, NULL);
		if (_fileMappingHandle) {
			_pMapBuffer = (const WCHAR*)MapViewOfFile(_fileMappingHandle, FILE_MAP_READ, 0, 0, 0);
			if (_pMapBuffer) {
				if (IsTextUnicode(_pMapBuffer, (int)_fileSize, NULL)) {
					_pReadBuffer = (WCHAR*)_pMapBuffer;

					// skip Unicode byte order mark
					if (*((WCHAR*)_pMapBuffer) == Global::UnicodeByteOrderMark) {
						_pReadBuffer++;
						_fileSize--;
					}
					return TRUE;
				}

				UnmapViewOfFile(_pReadBuffer);
				_pReadBuffer = nullptr;
			}

			CloseHandle(_fileMappingHandle);
			_fileMappingHandle = nullptr;
		}
	}

	return FALSE;
}
